package com.appspot.vlsakurajima.charset;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.mozilla.universalchardet.UniversalDetector;

public class UniversalEncodingDetectStreamReader {
	
	/**
	 * ストリームから文字コードを自動判別し、文字列を得る
	 * @param in 読み込むストリーム
	 * @return 読み込んだ文字コード
	 * @throws IOException 
	 */
	public static String read(InputStream in) throws IOException {
	    
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		UniversalDetector detector = new UniversalDetector(null);
	    //文字コード判別用にデータを与える
		byte[] buf = new byte[4096];
		int nread;
	    
	    do {
	    	nread = in.read(buf);
	    	out.write(buf, 0, nread);
	    	detector.handleData(buf, 0, nread);
	    } while ((nread > 0) && !detector.isDone());

	    detector.dataEnd();

	    //残りのデータを読み込む
	    while((nread = in.read(buf)) > 0) {
	    	out.write(buf, 0, nread);
	    }
	    
	    //エンコード判別不能の場合は取りあえずsjisを指定しておく
	    String encoding = detector.getDetectedCharset();
	    if (encoding == null) {
	    	encoding = "sjis";
	    }

	    //文字コードを指定して、読み込んだデータを文字列に変換する
	    String result = new String(out.toByteArray(), encoding);
	    
		return result;
	}
	
	public static void main(String[] args) throws IOException {
		//適当テスト用コード
		URL url = new URL("http://www.seisvol.kishou.go.jp/tokyo/STOCK/volinfo/gensho.html");
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		BufferedInputStream in = new BufferedInputStream(connection.getInputStream());
		String result = UniversalEncodingDetectStreamReader.read(in);
		in.close();
		System.out.println(result);
		
	}
}